package pe.edu.upc.dreamteam.dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

import pe.edu.upc.dreamteam.bean.Vuelo;

@Repository
public class VueloDAOImpl extends SimpleJdbcDaoSupport implements VueloDAO {

	@Autowired
	public VueloDAOImpl(DataSource dataSource) {
		setDataSource(dataSource);
	}

	public Vuelo consultarVuelo(Integer id) {
		return getSimpleJdbcTemplate()
				.queryForObject(
						"select id, aereolinea, origen, destino, fechaOrigen, fechaDestino, horaOrigen, horaDestino, "
								+ "estado, precio, pasajesDisponilbles, pasajesReservados from vuelos where id=?",
						new BeanPropertyRowMapper<Vuelo>(Vuelo.class), id);
	}

	public List<Vuelo> consultarVuelos() {
		return getSimpleJdbcTemplate()
				.query("select id, aereolinea, origen, destino, fechaOrigen, fechaDestino, horaOrigen, horaDestino, "
						+ "estado, precio, pasajesDisponilbles, pasajesReservados from vuelos",
						new BeanPropertyRowMapper<Vuelo>(Vuelo.class));
	}

	@Override
	public void registrarVuelo(Vuelo vuelo) {
		getJdbcTemplate()
				.update("insert into vuelos (aereolinea, origen, destino, fechaOrigen, fechaDestino, horaOrigen, horaDestino, "
						+ "estado, precio, pasajesDisponilbles, pasajesReservados) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
						vuelo.getAereolinea(), vuelo.getOrigen(),
						vuelo.getDestino(), vuelo.getFechaOrigen(),
						vuelo.getFechaDestino(), vuelo.getHoraOrigen(),
						vuelo.getHoraDestino(), vuelo.getEstado(),
						vuelo.getPrecio(), vuelo.getPasajesDisponilbles(),
						vuelo.getPasajesReservados());
		// Setear el id autogenerado por el identity de HSQL
		vuelo.setId(getSimpleJdbcTemplate().queryForInt("call identity()"));
	}

	@Override
	public void actualizarVuelo(Vuelo vuelo) {
		getSimpleJdbcTemplate()
				.update("update vuelos set aereolinea=?, origen=?, destino=?, fechaOrigen=?, "
						+ "fechaDestino=?, horaOrigen=?, horaDestino=?, "
						+ "estado=?, precio=?, pasajesDisponilbles=?, pasajesReservados=?",
						vuelo.getAereolinea(), vuelo.getOrigen(),
						vuelo.getDestino(), vuelo.getFechaOrigen(),
						vuelo.getFechaDestino(), vuelo.getHoraOrigen(),
						vuelo.getHoraDestino(), vuelo.getEstado(),
						vuelo.getPrecio(), vuelo.getPasajesDisponilbles(),
						vuelo.getPasajesReservados());
	}

	@Override
	public void eliminarVuelo(Integer id) {
		getSimpleJdbcTemplate().update("delete from vuelos where id=?", id);
	}

	@Override
	public List<Vuelo> consultarVuelosPorFechaOrigenDestino(Date fecha,
			String origen, String destino) {
		return getSimpleJdbcTemplate()
				.query("select id, aereolinea, origen, destino, fechaOrigen, fechaDestino, horaOrigen, horaDestino, "
						+ "estado, precio, pasajesDisponilbles, pasajesReservados from vuelos"
						+ "where origen=? and destino=? and fechaOrigen=?",
						new BeanPropertyRowMapper<Vuelo>(Vuelo.class), origen,
						destino, fecha);
	}

	@Override
	public List<Vuelo> consultarVuelo(Date id) {
		// TODO Auto-generated method stub
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
		return getSimpleJdbcTemplate()
				.query("select id, aereolinea, origen, destino, fechaOrigen, fechaDestino, horaOrigen, horaDestino, "
						+ "estado, precio, pasajesDisponilbles, pasajesReservados from vuelos"
						+ " where fechaOrigen=?",
						new BeanPropertyRowMapper<Vuelo>(Vuelo.class),
						formato.format(id));
	}

	@Override
	public List<Vuelo> consultarVuelo(String aerolinea, String origen,
			String destino, String fecvueini, String fecvuefin) {
		// TODO Auto-generated method stub
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
		Date xxx= new Date();
		Date dteFecIni=new Date();
		Date dteFecFin=new Date();
		try {
			if(!fecvueini.equals("XXX")) dteFecIni = formato.parse(fecvueini);
			if(!fecvuefin.equals("XXX")) dteFecFin = formato.parse(fecvuefin);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		
		//System.out.println(dteFecIni);
//		System.out.println(aerolinea);
//		System.out.println(formato.format(fecvueini));
		String qAerolinea="";
		String qOrigen="";
		String qDestino="";
		String qFecvueini="";
		String qFecvuefin="";
		String Query="";
		

		if (aerolinea.equals("XXX"))
			qAerolinea = " where 1=1";
		else
			qAerolinea = " where aereolinea='" + aerolinea+"'";

		if (origen.equals("XXX"))
			qOrigen = "";
		else
			qOrigen = " and origen='" + origen+"'";
		if (destino.equals("XXX"))
			qDestino = "";
		else
			qDestino = " and destino='" + destino+"'";

		if (fecvueini.equals("XXX"))
			qFecvueini = "";
		else
			qFecvueini = " and fechaOrigen='" + formato.format(dteFecIni)+"'";
		if (fecvuefin.equals("XXX"))
			qFecvuefin = "";
		else
			qFecvuefin = " and fechaDestino='" + formato.format(dteFecFin)+"'";

		//System.out.println(qAerolinea);
		
		Query="select id, aereolinea, origen, destino, fechaOrigen, fechaDestino, horaOrigen, horaDestino, "
				+ "estado, precio, pasajesDisponilbles, pasajesReservados from vuelos"
				+ qAerolinea
				+ qOrigen
				+ qDestino
				+ qFecvueini
				+ qFecvuefin;
		
		System.out.println(Query);
		
		return getSimpleJdbcTemplate()
				.query(Query,
						new BeanPropertyRowMapper<Vuelo>(Vuelo.class));
	}

}
